package file

import (
	"os"
	"path/filepath"
)

// 打开文件，用于读取数据。文件必须存在，否则出错。
func Open(name string) (*os.File, error) {
	return os.Open(name)
}

// 打开文件，用于读取数据。然后调用 call 函数，最后关闭文件。
func OpenThen(name string, call func(fd *os.File) error) error {
	fd, err := Open(name)
	if err != nil {
		return err
	}
	defer fd.Close()
	return call(fd)
}

// 打开文件，用于读取数据。然后调用 write 函数，最后关闭文件。
func OpenThenWrite(name string, write func(fd *os.File) (int64, error)) (int64, error) {
	fd, err := Open(name)
	if err != nil {
		return 0, err
	}
	defer fd.Close()
	return write(fd)
}

// 创建文件，用于写入数据，权限为 0644。所在目录不存在时，创建所有必要的目录；文件已存在时，清空原文件。
func Create(name string) (*os.File, error) {
	if err := os.MkdirAll(filepath.Dir(name), 0755); err != nil {
		return nil, err
	}
	return os.OpenFile(name, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
}

// 创建文件，用于写入数据，权限为 0644。所在目录不存在时，创建所有必要的目录；文件已存在时，清空原文件。
// 然后调用 call 函数，最后关闭文件。
func CreateThen(name string, call func(fd *os.File) error) error {
	fd, err := Create(name)
	if err != nil {
		return err
	}
	defer fd.Close()
	return call(fd)
}

// 创建文件，用于写入数据，权限为 0644。所在目录不存在时，创建所有必要的目录；文件已存在时，清空原文件。
// 然后调用 write 函数，最后关闭文件。
func CreateThenWrite(name string, write func(fd *os.File) (int64, error)) (int64, error) {
	fd, err := Create(name)
	if err != nil {
		return 0, err
	}
	defer fd.Close()
	return write(fd)
}
